package com.tedu.api.io;
import org.junit.Test;

import java.io.*;

/**
 * IO流----传对象---高级流
 *
 *
 *
 * ObjectOutputStream      对象输入流-----传Person.java对象--写操作
 * ObjectInputStream   对象输出流-----传Person.java对象--读操作
 *
 */
public class ObjectIO {
    /**
     * ObjectOutputStream 对象输出流
     * 使用方式：1.创建实现  序列化接口的对象
     *          2.对象输出流---xxx.obj文件
     *                       传输对象，指定格式obj
     */
    @Test

    public void testOOS() throws IOException {
        //1.创建Person对象
        Person p=new Person();
            p.setName("韩美娟");
            //数组--动态数组
        //  String【】 str={“1”，“2”，“3”}；静态动态数组
        //  String【】 str=new String【】{“1”}；
        p.setSay(new String[]{"百因必有果，你的报应就是我"});//动态组传输方式
        System.out.println("打印对象："+p);

        //对象输出文件   XXX.obj   Person.java
        OutputStream fos=
                new FileOutputStream("person.obj");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)    ---理解写出对象
         * 该方法会将给定对象按照其结构进行转换‘
         * 转换为一组"组"字节，在通过其处理流写出
         *
         *
         *
         *
         * NotSerializableExcption 没有序列化异常
         * 原因：写出类没有实现序列化接口
         *
         * 写出文件专业术语
         * 1.通过对象输出流将Person类，先转换为一组"组"字节
         *   这个过程【对象序列化】
         * 2.将序列化的字符通过字节流【低级流】写入文件中
         * 【硬盘上】做长久保存，这个过程【数据持久化】
         * 将person.obj持久化保存硬盘上
         */
        oos.writeObject(p);
        System.out.println("写出成功了~~");
    }



    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
        /**
         * ObjectInputStream  对象输入流
         * 序列化：将对象转换为二进制
         * 反序列化：将二进制转换为对象
         * readObject（）返回读取的对象【？】
         * 需求：将序列化 persion.obj文件  按照对象方法读入
         */
        //创建低级流
        FileInputStream fis=new FileInputStream("person.obj");
        //创建高级流--对象读入
        ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject()获取对象【反序列化操作：二进制转换为对象】
        System.out.println(ois.readObject());
        System.out.println("反序列化成功！");
    }
}